草庐IT

c++ - CppUnit泄漏

全部标签

c# - 为什么在循环中使用 StreamSocket 会导致内存泄漏?

我正在开发一个C#、UWP10解决方案,它使用快速、连续的读/写循环与网络设备通信。API提供的StreamSocket似乎工作得很好,直到我意识到存在内存泄漏:累积了Task。在堆中,每分钟数百个。我是否使用普通的旧while(true)在asyncTask中循环,或使用self发布ActionBlock使用TPL数据流(根据thisanswer),结果是相同的。如果我消除从套接字读取并专注于写入,我能够进一步隔离问题:我是否使用DataWriter.StoreAsync方法或更直接的StreamSocket.OutputStream.WriteAsync(IBufferbuffer

c# - 如何通过引用修改该字符串的非托管 C 库来发送字符串?

我是与非托管库交互的新手。我有一个非托管C函数,它通过函数内的引用修改字符串。我在从C#传递字符串并通过C函数修改它时遇到问题。这是C函数:__declspec(dllexport)void__stdcallTest(char*name){*name="Bar";}这是C#DLL导入代码:[DllImport(@"C:/blah/mylibrary.dll")]publicexternstaticstringTest(stringname);这是我用来调用函数的代码:strings="foo";Test(s);//Iwantstobe"Bar"aftertheaboveline我曾尝试

c# - 如何制作从 C# "Thread-safe"调用的 C (P/invoke) 代码

我有一些使用单个全局变量的简单C代码。显然这不是线程安全的,所以当我在C#中使用P/invoke从多个线程调用它时,事情就搞砸了。如何为每个线程单独导入此函数,或使其成为线程安全的?我尝试声明变量__declspec(thread),但这导致程序崩溃。我还尝试制作一个C++/CLI类,但它不允许成员函数是__declspec(naked),我需要(我正在使用内联汇编)。我在编写多线程C++代码方面经验不足,因此可能缺少某些内容。下面是一些示例代码:C#[DllImport("MyDll.dll",CallingConvention=CallingConvention.Cdecl)]pu

c# - 随机整数中最可能的位

我做过这样的实验——用C和C#制作了1000万个随机数。然后统计随机整数中15位中的每一位被设置了多少次。(我选择15位是因为C只支持最大0x7fff的随机整数)。我得到的是:我有两个问题:为什么有3个最可能的位?在C情况下,位8,10,12是最有可能的。和C#位6,8,11最有可能。与C#最可能位相比,C#最可能位也似乎大部分移动了2个位置。为什么是这样?因为C#使用其他RAND_MAX常量还是什么?我的C测试代码:voidaccumulateResults(intrandom,intbitSet[15]){inti;intisBitSet;for(i=0;iC#的测试代码:stat

c# - C DLL 中的 PInvoke char* 在 C# 中处理为字符串。空字符问题

CDLL中的函数如下所示:intmy_Funct(char*input,char*output);我必须从C#应用程序调用它。我通过以下方式执行此操作:...DllImportstuff...publicstaticexternintmy_Funct(stringinput,stringoutput);输入字符串完美地传输到DLL(我有可见的证据)。该函数填写的输出虽然是错误的。我有hexa数据,比如:3F-D9-00-01但不幸的是,两个零之后的所有内容都被截断了,只有前两个字节进入了我的C#应用程序。它发生了,因为(我猜)它被视为空字符并将其作为字符串的结尾。知道如何摆脱它吗?我试

c# - 图像加载内存泄漏与 C#

我的应用程序在加载大量图像时遇到内存泄漏问题。我是C#的新手,我认为内存泄漏问题的日子已经过去了。我无法弄清楚问题-也许我正在使用一些我没有正确处理的非托管模块?为了说明我的问题,我简化了导致问题的核心并将其移至一个干净的项目中。请注意,这些都是愚蠢的代码,不能反射(reflect)它来自的原始应用程序。在测试应用程序中,我有2个按钮,触发两个事件。按钮1-创建:将对象设置为数据上下文。这将加载图像并通过将对象设置为DataContext使它们保持事件状态:varimgPath=@"C:\some_fixed_path\img.jpg";DataContext=newSillyImag

c# - 改进/修复 C 样式 block 注释的正则表达式

我正在(用C#)编写一个简单的解析器来处理一种看起来很像经典C的脚本语言。在我的一个脚本文件中,我用来识别/*block注释*/的正则表达式进入了某种无限循环,占用了100%的CPU多年。我使用的正则表达式是这样的:/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/关于为什么这可能被锁定有什么建议吗?或者,我可以改用什么正则表达式?更多信息:使用面向.NET3.5的C#3.0;我正在使用Regex.Match(string,int)方法在字符串的特定索引处开始匹配;我已经让程序运行了一个多小时,但比赛还没有完成;传递给Regex构造函数的选项是Regex

c# - 解决C#内存泄漏的方法有哪些

我正在学习C#。据我所知,您必须正确设置才能让垃圾收集器真正删除应有的所有内容。我正在寻找多年来从你那里学到的智慧,聪明人。我有C++背景,非常习惯代码味道和开发模式。我想了解C#中的代码味道是什么样的。给我建议!删除内容的最佳方法是什么?你怎么知道什么时候有“内存泄漏”?编辑:我正在尝试开发一个“内存管理要始终做的事情”的list非常感谢。 最佳答案 C#,.NETFramework使用托管内存,所有内容(但分配的​​非托管资源)都被垃圾收集。可以安全地假设托管类型总是被垃圾收集。这包括数组、类和结构。随意执行int[]stuff

c# - 使用 Wea​​kReference 解决 .NET 未注册事件处理程序导致内存泄漏的问题

问题:已注册的事件处理程序创建了从事件到事件处理程序实例的引用。如果该实例无法注销事件处理程序(大概是通过Dispose),那么垃圾收集器将不会释放实例内存。例子:classFoo{publiceventActionAnEvent;publicvoidDoEvent(){if(AnEvent!=null)AnEvent();}}classBar{publicBar(Fool){l.AnEvent+=l_AnEvent;}voidl_AnEvent(){}}如果我实例化一个Foo,并将其传递给一个新的Bar构造函数,然后释放Bar对象,由于AnEvent注册,它不会被垃圾收集器释放。我认

c# - 如何在 C# Unity 中使用带有二维数组的 C 结构

所以我有一个具有以下结构的CAPItypedefstructmat4f_{floatm[4][4];}mat4f;它作为参数传递给我的一个API函数:voidmyFunction(constmat4fmatrix);我正在使用dll将此函数导出到Unity中的C#:[DllImport("mylib")]privatestaticexternvoidmyFunction(mat4fmatrix);我的问题是,我应该将相应的C#结构设为什么?现在我有以下内容:[StructLayout(LayoutKind.Sequential)]publicstructmat4f{publicfloa